package br.com.caelum.jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import br.com.caelum.jdbc.modelo.Categoria;
import br.com.caelum.jdbc.modelo.Produto;

public class ProdutosDao {

	private final Connection	connection;

	public ProdutosDao(final Connection connection) {
		this.connection = connection;
	}

	public void salva(final Produto produto) throws SQLException {
		final String sql = "insert into Produto (nome, descricao) values (?, ?)";

		try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {

			preparedStatement.setString(1, produto.getNome());
			preparedStatement.setString(2, produto.getDescricao());
			preparedStatement.execute();

			try (ResultSet resultSet = preparedStatement.getGeneratedKeys()) {
				if (resultSet.next()) {
					final int id = resultSet.getInt("id");
					produto.setId(id);
				}
			}
		}
	}

	public List<Produto> lista() throws SQLException {
		final List<Produto> produtos = new ArrayList<>();
		final String sql = "select * from Produto";

		try (final PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) {
			
			preparedStatement.execute();
			
			transformaResultadoEmProdutos(preparedStatement, produtos);
		}
		return produtos;
	}

	public List<Produto> busca(Categoria categoria) throws SQLException {
		List<Produto> produtos = new ArrayList<>();
		String sql = "select * from Produto where categoria_id = ?";
		
		try (final PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) {

			preparedStatement.setInt(1, categoria.getId());
			preparedStatement.execute();

			transformaResultadoEmProdutos(preparedStatement, produtos);
		}
		return produtos;
	}
	
	private void transformaResultadoEmProdutos(PreparedStatement preparedStatement, final List<Produto> produtos)
			throws SQLException {
		try (final ResultSet resultSet = preparedStatement.getResultSet()) {

			while (resultSet.next()) {
				final int id = resultSet.getInt("id");
				final String nome = resultSet.getString("nome");
				final String desc = resultSet.getString("descricao");

				final Produto produto = new Produto(nome, desc);
				produto.setId(id);

				produtos.add(produto);
			}
		}
	}

}
